//package com.example.service.listener;
//
//import com.example.entity.ImageFiles;
//import com.example.entity.SplitDTO;
//import com.example.service.ImageFilesService;
//import com.example.service.NiiFileService;
//import com.example.utils.RedisCache;
//import com.example.utils.TempFileUtil;
//import com.rabbitmq.client.Channel;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.amqp.rabbit.annotation.Exchange;
//import org.springframework.amqp.rabbit.annotation.Queue;
//import org.springframework.amqp.rabbit.annotation.QueueBinding;
//import org.springframework.amqp.rabbit.annotation.RabbitListener;
//import org.springframework.amqp.support.AmqpHeaders;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.messaging.handler.annotation.Header;
//import org.springframework.stereotype.Component;
//
//import java.io.IOException;
//import java.nio.file.Path;
//import java.util.Map;
//import java.util.concurrent.TimeUnit;
//
//@Component
//public class SpringRabbitListener {
//
//    @Autowired
//    private NiiFileService niiFileService;
//    @Autowired
//    private ImageFilesService imageFilesService;
//    private static final String REDIS_SET_KEY = "processed_message_ids"; // Redis Set 的 Key
//    private static final long SET_EXPIRE_TIME = 1; // Redis Set 的过期时间（单位：天）
//    private static final Logger log = LoggerFactory.getLogger(NiiFileService.class);
//    @Autowired
//    private RedisCache redisCache;
//
//    /*
//     * 监听direct交换机，接收png.queue队列的消息
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(
//                    name = "png.queue",
//                    durable = "true", // 队列持久化
//                    arguments = {
//                            @org.springframework.amqp.rabbit.annotation.Argument(
//                                    name = "x-message-ttl",
//                                    value = "300000", // 消息的 TTL，单位为毫秒（5分钟）
//                                    type = "java.lang.Integer"
//                            )
//                    }
//            ),
//            exchange = @Exchange(name = "amq.direct"),
//            key = {"png"}
//    ))
//    public void listenDirectPngUploadQueue(SplitDTO splitDTO, Channel channel, @Header(AmqpHeaders.DELIVERY_TAG) long deliveryTag) {
//        String messageId = splitDTO.getMessageId();
//        String seed = splitDTO.getSeed();
//
//        log.info("接收到消息，MessageID：{}，Seed：{}", messageId, seed);
//
//        try {
//            // 检查 Redis 和数据库的状态
//            boolean isMessageProcessed = redisCache.isMemberOfSet(REDIS_SET_KEY, messageId);
//            ImageFiles dbImageFiles = imageFilesService.selectBySeed(seed);
//
//            // 消息已经被处理过，同时数据库中也有相关记录
//            if (isMessageProcessed && dbImageFiles != null) {
//                log.warn("消息已被消费过，且数据库中已存在记录，跳过处理。MessageID：{}", messageId);
//                acknowledgeMessage(channel, deliveryTag);
//                return;
//            }
//
//            // 消息已处理过，但数据库没有存储对应记录，需要重新处理
//            if (isMessageProcessed && dbImageFiles == null) {
//                log.info("消息已被消费过，但数据库中未找到记录，重新处理。MessageID：{}", messageId);
//            }
//
//            // 消息未处理过，且数据库中也没有相关记录
//            if (!isMessageProcessed && dbImageFiles == null) {
//                log.info("消息未被消费，且数据库中无记录，开始处理。MessageID：{}", messageId);
//            }
//
//            // 将消息 ID 存入 Redis，避免重复处理
//            redisCache.addToSet(REDIS_SET_KEY, messageId, SET_EXPIRE_TIME, TimeUnit.DAYS);
//
//            // 获取临时文件路径
//            Path tempFilePath = splitDTO.getTempFilePath();
//
//            // 处理 Nii 文件
//            processNiiFile(splitDTO, tempFilePath);
//
//            // 进行模型拟合
//            modelFitting(splitDTO, tempFilePath);
//
//            // 删除临时文件
//            TempFileUtil.deleteTempPath(tempFilePath);
//
//            // 确认消息
//            acknowledgeMessage(channel, deliveryTag);
//        } catch (Exception e) {
//            // 捕获异常，记录错误日志，确认消息防止重复消费
//            log.error("消息处理失败，MessageID：{}，错误信息：{}", messageId, e.getMessage(), e);
//            acknowledgeMessage(channel, deliveryTag);
//            throw new RuntimeException("文件处理失败：" + e.getMessage(), e);
//        }
//    }
//
//    /**
//     * 处理 Nii 文件的业务逻辑
//     */
//    private void processNiiFile(SplitDTO splitDTO, Path tempFilePath) throws Exception {
//        log.info("开始处理 Nii 文件，TempFilePath：{}，Seed：{}，OriginalFilename：{}",
//                tempFilePath, splitDTO.getSeed(), splitDTO.getOriginalFilename());
//
//        niiFileService.processNiiFile(tempFilePath, splitDTO.getSeed(), splitDTO.getOriginalFilename());
//        log.info("Nii 文件处理完成，TempFilePath：{}", tempFilePath);
//    }
//
//    /**
//     * 进行模型拟合
//     * @param splitDTO
//     * @param tempFilePath
//     * @throws Exception
//     */
//    private void modelFitting(SplitDTO splitDTO, Path tempFilePath) throws Exception {
//        log.info("开始拟合 Nii 文件，TempFilePath：{}，Seed：{}",
//                tempFilePath, splitDTO.getSeed());
//        niiFileService.modelFitting(tempFilePath, splitDTO.getSeed());
//        log.info("Nii 文件拟合完成，TempFilePath：{}", tempFilePath);
//    }
//
//    /**
//     * 确认 RabbitMQ 消息
//     */
//    private void acknowledgeMessage(Channel channel, long deliveryTag) {
//        try {
//            channel.basicAck(deliveryTag, false);
//            log.info("消息已确认，DeliveryTag：{}", deliveryTag);
//        } catch (IOException ex) {
//            log.error("手动确认消息失败，DeliveryTag：{}，错误信息：{}", deliveryTag, ex.getMessage(), ex);
//            throw new RuntimeException("手动确认消息失败：" + ex.getMessage(), ex);
//        }
//    }
//
//
//    /*
//     * 测试的队列名称为：test_queue
//     */
//    @RabbitListener(queues = "test_queue")
//    public void listenSimpleQueueMessage(Map<String,Integer> msg) throws InterruptedException {
//        System.out.println("测试消费者接收到消息：【" + msg + "】");
//    }
//
//    /*
//     * 监听direct交换机，接收py.queue队列的消息
//     */
//    @RabbitListener(bindings = @QueueBinding(
//            value = @Queue(name = "nii.queue"),
//            exchange = @Exchange(name = "amq.direct"),
//            key = {"nii"}
//    ))
//    public void listenDirectNiiUploadQueue(String msg){
//        System.out.println("处理的Nii文件上传的消费者收到nii.queue的消息：【" + msg + "】");
//
//    }
//
//}